import axios from 'axios'
import { getToken, getRefreshToken, setToken } from '../utils/auth'
import { refreshToken } from '../api/users'
import { Message } from 'element-ui'
import config from '../config/config'

const instance = axios.create({
  baseURL: config.baseUrl,
  timeout: 5000
});

// 对每一次的请求进行拦截，并根据需要，处理一些逻辑
instance.interceptors.request.use(
  (config) => {
    // console.log(config);
    let token = getToken()
    if (token) {
      config.headers['Authorization'] = 'Bearer ' + token
    }
    return config
  }, (err) => {
    // console.log(err);
    return Promise.reject(err)
  }
)

// 对每一次的服务器响应进行拦截，并根据需要，处理一些逻辑
instance.interceptors.response.use(
  async (response) => {
    console.log(response);
    if (response.status === 200) {
      return response.data
    }
    return response
  }, async (err) => {
    if (err.response) {
      // 后端原来返回的是一个401网络错误，无法捕获401错误，对后端token未通过验证进行自定义返回信息就可以捕获401错误
      if (err.response.status === 401) {
        Message.info('当前登录已经失效，正在为你重新登录，请稍候。。。')
        let param = {
          token: getToken(),
          refreshToken: getRefreshToken()
        }

        // 如果可以重新刷新获得token，则继续返回原来要进行的请求，否则清空token和refreshToken并返回错误
        refreshToken(param).then(res => {
          console.log(res);
          setToken(res.data.token, res.data.refreshToken)
          Message({
            type: 'success',
            message: res.msg+' 请刷新页面或者点击页面中的刷新按钮'
          })
          // 刷新token后，继续执行原来（想要执行的）请求
          return instance.request(err.config);
        }).catch(err => {
          console.log(err);
          // clearToken()
        })

      }
    }

    return Promise.reject(err)
  }
)

export default instance